package com.hospital.drug.drugzhou.service.impl;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.hospital.drug.drugzhou.dao.DrugMapper;
import com.hospital.drug.drugzhou.dao.DrugStockMapper;
import com.hospital.drug.drugzhou.dao.MedicateMapper;
import com.hospital.drug.drugzhou.entity.Drug;
import com.hospital.drug.drugzhou.entity.DrugStock;
import com.hospital.drug.drugzhou.entity.Medicate;
import com.hospital.drug.drugzhou.service.MedicateService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Transactional;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @description：
 * @author：zou
 * @date：2021/9/16 13:22
 * @versions：v1.0
 */
@Service
public class MedicateServiceImpl implements MedicateService {

    @Autowired
    private DrugMapper drugMapper;

    @Autowired
    private MedicateMapper medicateMapper;

    @Autowired
    private DrugStockMapper drugStockMapper;

    /**
     * 查询申请记录
     *
     * @param xuTime      //用户选择时间段
     * @param type        //申请类型
     * @param pageSize    //页大小
     * @param currentPage //页码
     * @return json对象
     */
    @Override
    public JSONObject selPage(int xuTime, int type, int pageSize, int currentPage) {

        JSONObject jsOb = new JSONObject();   //json对象

        jsOb.put("code", 0);    //状态码 code
        jsOb.put("msg", "");    //错误提示 msg

        int start = (currentPage - 1) * pageSize;    //计算起始下标

        Map<String, Object> map = new HashMap<>();    //参数列表
        map.put("xuTime", xuTime);
        map.put("type", type);
        map.put("start", start);
        map.put("pageSize", pageSize);

        int count = medicateMapper.totalCount(map);  //得到总记录数

        List<Medicate> list = medicateMapper.medicateList(map);    //得到结果  单页数据

        jsOb.put("count", count);  //记录数 count

        jsOb.put("data", JSON.toJSON(list));    //将查询出的集合转换成JSON数据  toJSON

        return jsOb;   //返回json对象
    }

    /**
     * 药品管理
     *
     * @param medicate 申请记录
     * @return 0：失败  1：添加库存成功  2：新增药品成功
     */
    @Override
    @Transactional(isolation = Isolation.READ_COMMITTED)
    public int drugManage(Medicate medicate) {

        String type = medicate.getType();     //得到申请记录的类型

        //根据申请类型处理不同的申请
        if (type.equals("补充库存")) {    //补充库存

            List<DrugStock> list = drugStockMapper.drugList(medicate.getDate());  //根据时间查询同一批药品

            for (int i = 0; i < list.size(); i++) {            //循环遍历
                drugMapper.replenish(list.get(i).getDrugId(), list.get(i).getCount());
            }

            medicateMapper.updMedicate(medicate.getId());  //修改添加库存申请状态

            return 1;  //添加库存成功
        } else if (type.equals("新增药品")) {    //新增药品

            String applyDrug = medicate.getApplyDrug();     //新增药品名称
            int drugType = medicate.getDrugType();          //新增药品类型
            String unit = medicate.getUnit();               //新增药品单位 例:[瓶、盒]
            double price = medicate.getPrice();             //新增药品价格
            int count = medicate.getCount();                //新增药品数量
            String remark = medicate.getRemark();           //备注

            Drug drug = new Drug(null, applyDrug, drugType, unit, price, count, remark);    //新增药品对象

            drugMapper.insert(drug);  //插入新药品

            medicateMapper.updMedicate(medicate.getId());  //修改新增药品申请状态

            return 2;  //新增药品成功
        }
        return 0;  //新增失败
    }

    /**
     * 新增库存申请 (补充库存)
     *
     * @param medicate 增加库存
     * @return true 新增申请成功
     */
    @Override
    public boolean addInventory(Medicate medicate) {
        return medicateMapper.addInventory(medicate) == 1;
    }

    /**
     * 新增药品申请 (购买新药)
     *
     * @param medicate 新增药品
     * @return true 新增申请成功
     */
    @Override
    public boolean addDrug(Medicate medicate) {
        return medicateMapper.addDrug(medicate) == 1;
    }

    /**
     * 添加药品库存
     *
     * @param list 库存药品集合
     * @param date 入库时间
     * @return 插入的条数
     */
    @Override
    public int drugInventory(List<DrugStock> list, String date) {
        int count = 0;
        for (int i = 0; i < list.size(); i++) {
            count += drugStockMapper.drugInventory(list.get(i), date);
        }
        return count;
    }

    /**
     * 根据时间查询相同的库存药品
     *
     * @param date 时间
     * @return 库存名单
     */
    @Override
    public List<DrugStock> drugList(String date) {
        return drugStockMapper.drugList(date);
    }


}
